// 网络计算器的处理计算的业务模块
#include <iostream>
#include "Protocol.hpp"

class Cal
{
public:
    // 计算方法
    Response Execute(Request &req)
    {
        Response resp(0, 0); // 先把结果和情况初始化为0，表示默认情况是运算成功
        switch (req.Oper())
        {
        case '+':
            resp.SetResult(req.X() + req.Y());
            break;
        case '-':
            resp.SetResult(req.X() - req.Y());
            break;
        case '*':
            resp.SetResult(req.X() * req.Y());
            break;
        case '/':
        {
            // 判断是否存在除零错误
            if (req.Y() == 0)
            {
                // 设置计算异常情况
                resp.SetCode(1); // 规定1为除零错误
            }
            else
            {
                resp.SetResult(req.X() / req.Y());
            }
        }
        break;
        case '%':
            // 判断是否存在模零错误
            if (req.Y() == 0)
            {
                // 设置计算异常情况
                resp.SetCode(2); // 规定1为模零错误
            }
            else
            {
                resp.SetResult(req.X() % req.Y());
            }
            break;
        default:
            // 发过来的运算操作符不对，非法操作
            resp.SetCode(3); // 规定3为非法操作
            break;
        }

        // 到这里说明计算完成了，直接返回resp
        return resp;
    }
};